/*
 * File:        dataTables.editor.min.js
 * Version:     1.2.3
 * Author:      SpryMedia (www.sprymedia.co.uk)
 * Info:        http://editor.datatables.net
 * 
 * Copyright 2012 SpryMedia, all rights reserved.
 * License: DataTables Editor - http://editor.datatables.net/license
 */
/*
     DataTables Editor: http://editor.datatables.net/license
*/
(function(m, o, n, e, j) {
    var f = function(a) { ! this instanceof f && alert("DataTables Editor must be initilaised as a 'new' instance'");
        this._constructor(a)
    };
    j.Editor = f;
    f.models = {};
    f.models.displayController = {
        init: function() {},
        open: function() {},
        close: function() {}
    };
    f.models.field = {
        className: "",
        name: null,
        dataProp: "",
        label: "",
        id: "",
        type: "text",
        fieldInfo: "",
        labelInfo: "",
        "default": "",
        dataSourceGet: null,
        dataSourceSet: null,
        el: null,
        _fieldMessage: null,
        _fieldInfo: null,
        _fieldError: null,
        _labelInfo: null
    };
    f.models.fieldType = {
        create: function() {},
        get: function() {},
        set: function() {},
        enable: function() {},
        disable: function() {}
    };
    f.models.settings = {
        ajaxUrl: "",
        ajax: null,
        domTable: null,
        dbTable: "",
        opts: null,
        displayController: null,
        fields: [],
        order: [],
        id: -1,
        displayed: !1,
        processing: !1,
        editRow: null,
        removeRows: null,
        action: null,
        idSrc: null,
        events: {
            onProcessing: [],
            onPreOpen: [],
            onOpen: [],
            onPreClose: [],
            onClose: [],
            onPreSubmit: [],
            onPostSubmit: [],
            onSubmitComplete: [],
            onSubmitSuccess: [],
            onSubmitError: [],
            onInitCreate: [],
            onPreCreate: [],
            onCreate: [],
            onPostCreate: [],
            onInitEdit: [],
            onPreEdit: [],
            onEdit: [],
            onPostEdit: [],
            onInitRemove: [],
            onPreRemove: [],
            onRemove: [],
            onPostRemove: [],
            onSetData: [],
            onInitComplete: []
        }
    };
    f.models.button = {
        label: null,
        fn: null,
        className: null
    };
    f.display = {};
    var k = jQuery,
    g;
    f.display.lightbox = k.extend(!0, {},
    f.models.displayController, {
        init: function() {
            g._init();
            return g
        },
        open: function(a, c, b) {
            if (g._shown) b && b();
            else {
                g._dte = a;
                k(g._dom.content).children().detach();
                g._dom.content.appendChild(c);
                g._dom.content.appendChild(g._dom.close);
                g._shown = true;
                g._show(b)
            }
        },
        close: function(a, c) {
            if (g._shown) {
                g._dte = a;
                g._hide(c);
                g._shown = false
            } else c && c()
        },
        _init: function() {
            if (!g._ready) {
                g._dom.content = k("div.DTED_Lightbox_Content", g._dom.wrapper)[0];
                o.body.appendChild(g._dom.background);
                o.body.appendChild(g._dom.wrapper);
                g._dom.background.style.visbility = "hidden";
                g._dom.background.style.display = "block";
                g._cssBackgroundOpacity = k(g._dom.background).css("opacity");
                g._dom.background.style.display = "none";
                g._dom.background.style.visbility = "visible"
            }
        },
        _show: function(a) {
            a || (a = function() {});
            g._dom.content.style.height = "auto";
            var c = g._dom.wrapper.style;
            c.opacity = 0;
            c.display = "block";
            g._heightCalc();
            c.display = "none";
            c.opacity = 1;
            k(g._dom.wrapper).fadeIn();
            g._dom.background.style.opacity = 0;
            g._dom.background.style.display = "block";
            k(g._dom.background).animate({
                opacity: g._cssBackgroundOpacity
            },
            "normal", a);
            k(g._dom.close).bind("click.DTED_Lightbox",
            function() {
                g._dte.close("icon")
            });
            k(g._dom.background).bind("click.DTED_Lightbox",
            function() {
                g._dte.close("background")
            });
            k("div.DTED_Lightbox_Content_Wrapper", g._dom.wrapper).bind("click.DTED_Lightbox",
            function(a) {
                k(a.target).hasClass("DTED_Lightbox_Content_Wrapper") && g._dte.close("background")
            });
            k(m).bind("resize.DTED_Lightbox",
            function() {
                g._heightCalc()
            })
        },
        _heightCalc: function() {
            g.conf.heightCalc ? g.conf.heightCalc(g._dom.wrapper) : k(g._dom.content).children().height();
            var a = k(m).height() - g.conf.windowPadding * 2 - k("div.DTE_Header", g._dom.wrapper).outerHeight() - k("div.DTE_Footer", g._dom.wrapper).outerHeight();
            k("div.DTE_Body_Content", g._dom.wrapper).css("maxHeight", a)
        },
        _hide: function(a) {
            a || (a = function() {});
            k([g._dom.wrapper, g._dom.background]).fadeOut("normal", a);
            k(g._dom.close).unbind("click.DTED_Lightbox");
            k(g._dom.background).unbind("click.DTED_Lightbox");
            k("div.DTED_Lightbox_Content_Wrapper", g._dom.wrapper).unbind("click.DTED_Lightbox");
            k(m).unbind("resize.DTED_Lightbox")
        },
        _dte: null,
        _ready: !1,
        _shown: !1,
        _cssBackgroundOpacity: 1,
        _dom: {
            wrapper: k('<div class="DTED_Lightbox_Wrapper"><div class="DTED_Lightbox_Container"><div class="DTED_Lightbox_Content_Wrapper"><div class="DTED_Lightbox_Content"></div></div></div></div>')[0],
            background: k('<div class="DTED_Lightbox_Background"></div>')[0],
            close: k('<div class="DTED_Lightbox_Close"></div>')[0],
            content: null
        }
    });
    g = f.display.lightbox;
    g.conf = {
        windowPadding: 100,
        heightCalc: null
    };
    var i = jQuery,
    d;
    f.display.envelope = i.extend(!0, {},
    f.models.displayController, {
        init: function(a) {
            d._dte = a;
            d._init();
            return d
        },
        open: function(a, c, b) {
            d._dte = a;
            i(d._dom.content).children().detach();
            d._dom.content.appendChild(c);
            d._dom.content.appendChild(d._dom.close);
            d._show(b)
        },
        close: function(a, c) {
            d._dte = a;
            d._hide(c)
        },
        _init: function() {
            if (!d._ready) {
                d._dom.content = i("div.DTED_Envelope_Container", d._dom.wrapper)[0];
                o.body.appendChild(d._dom.background);
                o.body.appendChild(d._dom.wrapper);
                d._dom.background.style.visbility = "hidden";
                d._dom.background.style.display = "block";
                d._cssBackgroundOpacity = i(d._dom.background).css("opacity");
                d._dom.background.style.display = "none";
                d._dom.background.style.visbility = "visible"
            }
        },
        _show: function(a) {
            a || (a = function() {});
            d._dom.content.style.height = "auto";
            var c = d._dom.wrapper.style;
            c.opacity = 0;
            c.display = "block";
            var b = d._findAttachRow(),
            e = d._heightCalc(),
            h = b.offsetWidth;
            c.display = "none";
            c.opacity = 1;
            d._dom.wrapper.style.width = h + "px";
            d._dom.wrapper.style.marginLeft = -(h / 2) + "px";
            d._dom.wrapper.style.top = i(b).offset().top + b.offsetHeight + "px";
            d._dom.content.style.top = -1 * e - 20 + "px";
            d._dom.background.style.opacity = 0;
            d._dom.background.style.display = "block";
            i(d._dom.background).animate({
                opacity: d._cssBackgroundOpacity
            },
            "normal");
            i(d._dom.wrapper).fadeIn();
            d.conf.windowScroll ? i("html,body").animate({
                scrollTop: i(b).offset().top + b.offsetHeight - d.conf.windowPadding
            },
            function() {
                i(d._dom.content).animate({
                    top: 0
                },
                600, a)
            }) : i(d._dom.content).animate({
                top: 0
            },
            600, a);
            i(d._dom.close).bind("click.DTED_Envelope",
            function() {
                d._dte.close("icon")
            });
            i(d._dom.background).bind("click.DTED_Envelope",
            function() {
                d._dte.close("background")
            });
            i("div.DTED_Lightbox_Content_Wrapper", d._dom.wrapper).bind("click.DTED_Envelope",
            function(a) {
                i(a.target).hasClass("DTED_Envelope_Content_Wrapper") && d._dte.close("background")
            });
            i(m).bind("resize.DTED_Envelope",
            function() {
                d._heightCalc()
            })
        },
        _heightCalc: function() {
            d.conf.heightCalc ? d.conf.heightCalc(d._dom.wrapper) : i(d._dom.content).children().height();
            var a = i(m).height() - d.conf.windowPadding * 2 - i("div.DTE_Header", d._dom.wrapper).outerHeight() - i("div.DTE_Footer", d._dom.wrapper).outerHeight();
            i("div.DTE_Body_Content", d._dom.wrapper).css("maxHeight", a);
            return i(d._dte.dom.wrapper).outerHeight()
        },
        _hide: function(a) {
            a || (a = function() {});
            i(d._dom.content).animate({
                top: -(d._dom.content.offsetHeight + 50)
            },
            600,
            function() {
                i([d._dom.wrapper, d._dom.background]).fadeOut("normal", a)
            });
            i(d._dom.close).unbind("click.DTED_Lightbox");
            i(d._dom.background).unbind("click.DTED_Lightbox");
            i("div.DTED_Lightbox_Content_Wrapper", d._dom.wrapper).unbind("click.DTED_Lightbox");
            i(m).unbind("resize.DTED_Lightbox")
        },
        _findAttachRow: function() {
            if (d.conf.attach === "head" || d._dte.s.action === "create") return i(d._dte.s.domTable).dataTable().fnSettings().nTHead;
            if (d._dte.s.action === "edit") return d._dte.s.editRow;
            if (d._dte.s.action === "remove") return d._dte.s.removeRows[0]
        },
        _dte: null,
        _ready: !1,
        _cssBackgroundOpacity: 1,
        _dom: {
            wrapper: i('<div class="DTED_Envelope_Wrapper"><div class="DTED_Envelope_ShadowLeft"></div><div class="DTED_Envelope_ShadowRight"></div><div class="DTED_Envelope_Container"></div></div>')[0],
            background: i('<div class="DTED_Envelope_Background"></div>')[0],
            close: i('<div class="DTED_Envelope_Close">&times;</div>')[0],
            content: null
        }
    });
    d = f.display.envelope;
    d.conf = {
        windowPadding: 50,
        heightCalc: null,
        attach: "row",
        windowScroll: !0
    };
    f.prototype.add = function(a) {
        var c = this,
        b = this.classes.field;
        if (e.isArray(a)) for (var b = 0,
        d = a.length; b < d; b++) this.add(a[b]);
        else a = e.extend(!0, {},
        f.models.field, a),
        a.id = "DTE_Field_" + a.name,
        "" === a.dataProp && (a.dataProp = a.name),
        a.dataSourceGet = function() {
            var b = e(c.s.domTable).dataTable().oApi._fnGetObjectDataFn(a.dataProp);
            a.dataSourceGet = b;
            return b.apply(c, arguments)
        },
        a.dataSourceSet = function() {
            var b = e(c.s.domTable).dataTable().oApi._fnSetObjectDataFn(a.dataProp);
            a.dataSourceSet = b;
            return b.apply(c, arguments)
        },
        b = e('<div class="' + b.wrapper + " " + b.typePrefix + a.type + " " + b.namePrefix + a.name + " " + a.className + '"><label data-dte-e="label" class="' + b.label + '" for="' + a.id + '">' + a.label + '<div data-dte-e="msg-label" class="' + b["msg-label"] + '">' + a.labelInfo + '</div></label><div data-dte-e="input" class="' + b.input + '"><div data-dte-e="msg-error" class="' + b["msg-error"] + '"></div><div data-dte-e="msg-message" class="' + b["msg-message"] + '"></div><div data-dte-e="msg-info" class="' + b["msg-info"] + '">' + a.fieldInfo + "</div></div></div>")[0],
        d = f.fieldTypes[a.type].create.call(this, a),
        null !== d ? this._$("input", b).prepend(d) : b.style.display = "none",
        this.dom.formContent.appendChild(b),
        this.dom.formContent.appendChild(this.dom.formClear),
        a.el = b,
        a._fieldInfo = this._$("msg-info", b)[0],
        a._labelInfo = this._$("msg-label", b)[0],
        a._fieldError = this._$("msg-error", b)[0],
        a._fieldMessage = this._$("msg-message", b)[0],
        this.s.fields.push(a),
        this.s.order.push(a.name)
    };
    f.prototype.buttons = function(a) {
        var c = this,
        b, d, h;
        if (e.isArray(a)) {
            e(this.dom.buttons).empty();
            var f = function(a) {
                return function(b) {
                    b.preventDefault();
                    a.fn && a.fn.call(c)
                }
            };
            b = 0;
            for (d = a.length; b < d; b++) h = o.createElement("button"),
            a[b].label && (h.innerHTML = a[b].label),
            a[b].className && (h.className = a[b].className),
            e(h).click(f(a[b])),
            this.dom.buttons.appendChild(h)
        } else this.buttons([a])
    };
    f.prototype.clear = function(a) {
        if (a) if (e.isArray(a)) for (var c = 0,
        b = a.length; c < b; c++) this.clear(a[c]);
        else c = this._findFieldIndex(a),
        c !== n && (e(this.s.fields[c].el).remove(), this.s.fields.splice(c, 1), a = e.inArray(a, this.s.order), this.s.order.splice(a, 1));
        else e("div." + this.classes.field.wrapper, this.dom.wrapper).remove(),
        this.s.fields.splice(0, this.s.fields.length),
        this.s.order.splice(0, this.s.order.length)
    };
    f.prototype.close = function(a) {
        var c = this;
        this._display("close",
        function() {
            c._clearDynamicInfo()
        },
        a)
    };
    f.prototype.create = function(a, c, b) {
        var d = this,
        h = this.s.fields;
        this.s.id = "";
        this.s.action = "create";
        this.dom.form.style.display = "block";
        this._actionClass();
        a && this.title(a);
        c && this.buttons(c);
        a = 0;
        for (c = h.length; a < c; a++) this.field(h[a].name).set(h[a]["default"]);
        this._callbackFire("onInitCreate"); (b === n || b) && this._display("open",
        function() {
            e("input,select,textarea", d.dom.wrapper).filter(":visible").filter(":enabled").filter(":eq(0)").focus()
        })
    };
    f.prototype.disable = function(a) {
        if (e.isArray(a)) for (var c = 0,
        b = a.length; c < b; c++) this.disable(a[c]);
        else this.field(a).disable()
    };
    f.prototype.edit = function(a, c, b, d) {
        var h = this;
        this.s.id = this._rowId(a);
        this.s.editRow = a;
        this.s.action = "edit";
        this.dom.form.style.display = "block";
        this._actionClass();
        c && this.title(c);
        b && this.buttons(b);
        a = e(this.s.domTable).dataTable()._(a)[0];
        c = 0;
        for (b = this.s.fields.length; c < b; c++) {
            var f = this.s.fields[c],
            g = f.dataSourceGet(a, "editor");
            this.field(f.name).set("" !== f.dataProp && g !== n ? g: f["default"])
        }
        this._callbackFire("onInitEdit"); (d === n || d) && this._display("open",
        function() {
            e("input,select,textarea", h.dom.wrapper).filter(":visible").filter(":enabled").filter(":eq(0)").focus()
        })
    };
    f.prototype.enable = function(a) {
        if (e.isArray(a)) for (var c = 0,
        b = a.length; c < b; c++) this.enable(a[c]);
        else this.field(a).enable()
    };
    f.prototype.error = function(a, c) {
        if (c === n) this._message(this.dom.formError, "fade", a);
        else {
            var b = this._findField(a);
            b && (this._message(b._fieldError, "slide", c), e(b.el).addClass(this.classes.field.error))
        }
    };
    f.prototype.field = function(a) {
        var c = this,
        b = {},
        d = this._findField(a),
        h = f.fieldTypes[d.type];
        e.each(h,
        function(a, e) {
            b[a] = "function" === typeof e ?
            function() {
                var b = [].slice.call(arguments);
                b.unshift(d);
                return h[a].apply(c, b)
            }: e
        });
        return b
    };
    f.prototype.fields = function() {
        for (var a = [], c = 0, b = this.s.fields.length; c < b; c++) a.push(this.s.fields[c].name);
        return a
    };
    f.prototype.get = function(a) {
        var c = this,
        b = {};
        return a === n ? (e.each(this.fields(),
        function(a, e) {
            b[e] = c.get(e)
        }), b) : this.field(a).get()
    };
    f.prototype.hide = function(a) {
        var c, b;
        if (a) if (e.isArray(a)) {
            c = 0;
            for (b = a.length; c < b; c++) this.hide(a[c])
        } else {
            if (a = this._findField(a)) this.s.displayed ? e(a.el).slideUp() : a.el.style.display = "none"
        } else {
            c = 0;
            for (b = this.s.fields.length; c < b; c++) this.hide(this.s.fields[c].name)
        }
    };
    f.prototype.message = function(a, c) {
        if (c === n) this._message(this.dom.formInfo, "fade", a);
        else {
            var b = this._findField(a);
            this._message(b._fieldMessage, "slide", c)
        }
    };
    f.prototype.node = function(a) {
        return (a = this._findField(a)) ? a.el: n
    };
    f.prototype.off = function(a, c) {
        "function" === typeof e().off ? e(this).off(a, c) : e(this).unbind(a, c)
    };
    f.prototype.on = function(a, c) {
        if ("function" === typeof e().on) e(this).on(a, c);
        else e(this).bind(a, c)
    };
    f.prototype.open = function() {
        this._display("open")
    };
    f.prototype.order = function(a) {
        if (!a) return this.s.order;
        1 < arguments.length && !e.isArray(a) && (a = Array.prototype.slice.call(arguments));
        if (this.s.order.slice().sort().join("-") !== a.slice().sort().join("-")) throw "All fields, and no additional fields, must be provided for ordering.";
        e.extend(this.s.order, a)
    };
    f.prototype.remove = function(a, c, b, d) {
        e.isArray(a) ? (this.s.id = "", this.s.action = "remove", this.s.removeRows = a, this.dom.form.style.display = "none", this._actionClass(), c && this.title(c), b && this.buttons(b), this._callbackFire("onInitRemove"), (d === n || d) && this._display("open")) : this.remove([a], c, b, d)
    };
    f.prototype.set = function(a, c) {
        this.field(a).set(c)
    };
    f.prototype.show = function(a) {
        var c, b;
        if (a) if (e.isArray(a)) {
            c = 0;
            for (b = a.length; c < b; c++) this.show(a[c])
        } else {
            if (a = this._findField(a)) this.s.displayed ? e(a.el).slideDown() : a.el.style.display = "block"
        } else {
            c = 0;
            for (b = this.s.fields.length; c < b; c++) this.show(this.s.fields[c].name)
        }
    };
    f.prototype.submit = function(a, c, b, d) {
        var h = this,
        f = !0;
        if (!this.s.processing && this.s.action) {
            this._processing(!0);
            var g = e('div[data-dte-e="msg-error"]:visible', this.dom.wrapper);
            0 < g.length ? g.slideUp(function() {
                f && (h._submit(a, c, b, d), f = !1)
            }) : this._submit(a, c, b, d);
            e("div." + this.classes.field.error, this.dom.wrapper).removeClass(this.classes.field.error);
            e(this.dom.formError).fadeOut()
        }
    };
    f.prototype.title = function(a) {
        this.dom.header.innerHTML = a
    };
    f.prototype._constructor = function(a) {
        a = e.extend(!0, {},
        f.defaults, a);
        this.s = e.extend(!0, {},
        f.models.settings);
        this.classes = e.extend(!0, {},
        f.classes);
        var c = this,
        b = this.classes;
        this.dom = {
            wrapper: e('<div class="' + b.wrapper + '"><div data-dte-e="processing" class="' + b.processing.indicator + '"></div><div data-dte-e="head" class="' + b.header.wrapper + '"><div data-dte-e="head_content" class="' + b.header.content + '"></div></div><div data-dte-e="body" class="' + b.body.wrapper + '"><div data-dte-e="body_content" class="' + b.body.content + '"><div data-dte-e="form_info" class="' + b.form.info + '"></div><form data-dte-e="form" class="' + b.form.tag + '"><div data-dte-e="form_content" class="' + b.form.content + '"><div data-dte-e="form_clear" class="' + b.form.clear + '"></div></div></form></div></div><div data-dte-e="foot" class="' + b.footer.wrapper + '"><div data-dte-e="foot_content" class="' + b.footer.content + '"><div data-dte-e="form_error" class="' + b.form.error + '"></div><div data-dte-e="form_buttons" class="' + b.form.buttons + '"></div></div></div></div>')[0],
            form: null,
            formClear: null,
            formError: null,
            formInfo: null,
            formContent: null,
            header: null,
            body: null,
            bodyContent: null,
            footer: null,
            processing: null,
            buttons: null
        };
        this.s.domTable = a.domTable;
        this.s.dbTable = a.dbTable;
        this.s.ajaxUrl = a.ajaxUrl;
        this.s.ajax = a.ajax;
        this.s.idSrc = a.idSrc;
        this.i18n = a.i18n;
        if (m.TableTools) {
            var d = m.TableTools.BUTTONS,
            h = this.i18n;
            e.each(["create", "edit", "remove"],
            function(a, c) {
                d["editor_" + c].sButtonText = h[c].button;
                d["editor_" + c].formTitle = h[c].title;
                d["editor_" + c].formButtons[0].label = h[c].submit
            });
            d.editor_remove.question = function(a) {
                return ("string" === h.remove.confirm ? h.remove.confirm: h.remove.confirm[a] ? h.remove.confirm[a] : h.remove.confirm._).replace(/%d/g, a)
            }
        }
        e.each(a.events,
        function(a, b) {
            c._callbackReg(a, b, "User")
        });
        var b = this.dom,
        g = b.wrapper;
        b.form = this._$("form", g)[0];
        b.formClear = this._$("form_clear", g)[0];
        b.formError = this._$("form_error", g)[0];
        b.formInfo = this._$("form_info", g)[0];
        b.formContent = this._$("form_content", g)[0];
        b.header = this._$("head_content", g)[0];
        b.body = this._$("body", g)[0];
        b.bodyContent = this._$("body_content", g)[0];
        b.footer = this._$("foot", g)[0];
        b.processing = this._$("processing", g)[0];
        b.buttons = this._$("form_buttons", g)[0];
        "" !== this.s.dbTable && e(this.dom.wrapper).addClass("DTE_Table_Name_" + this.s.dbTable);
        if (a.fields) {
            b = 0;
            for (g = a.fields.length; b < g; b++) this.add(a.fields[b])
        }
        e(this.dom.form).submit(function(a) {
            c.submit();
            a.preventDefault()
        });
        this.s.displayController = f.display[a.display].init(this);
        this._callbackFire("onInitComplete", [])
    };
    f.prototype._$ = function(a, c) {
        c === n && (c = o);
        return e('*[data-dte-e="' + a + '"]', c)
    };
    f.prototype._actionClass = function() {
        var a = this.classes.actions;
        e(this.dom.wrapper).removeClass([a.create, a.edit, a.remove].join(" "));
        "create" === this.s.action ? e(this.dom.wrapper).addClass(a.create) : "edit" === this.s.action ? e(this.dom.wrapper).addClass(a.edit) : "remove" === this.s.action && e(this.dom.wrapper).addClass(a.remove)
    };
    f.prototype._callbackFire = function(a, c) {
        var b, d;
        c === n && (c = []);
        if (e.isArray(a)) for (b = 0; b < a.length; b++) this._callbackFire(a[b], c);
        else {
            var h = this.s.events[a],
            f = [];
            b = 0;
            for (d = h.length; b < d; b++) f.push(h[b].fn.apply(this, c));
            null !== a && (b = e.Event(a), e(this).trigger(b, c), f.push(b.result));
            return f
        }
    };
    f.prototype._callbackReg = function(a, c, b) {
        c && this.s.events[a].push({
            fn: c,
            name: b
        })
    };
    f.prototype._clearDynamicInfo = function() {
        e("div." + this.classes.field.error, this.dom.wrapper).removeClass(this.classes.field.error);
        this._$("msg-error", this.dom.wrapper).html("").css("display", "none");
        this.error("");
        this.message("")
    };
    f.prototype._display = function(a, c, b) {
        var d = this;
        "open" === a ? (a = this._callbackFire("onPreOpen", [b]), -1 === e.inArray(!1, a) && (e.each(d.s.order,
        function(a, c) {
            d.dom.formContent.appendChild(d.node(c))
        }), d.dom.formContent.appendChild(d.dom.formClear), d.s.displayed = !0, this.s.displayController.open(this, this.dom.wrapper,
        function() {
            c && c()
        }), this._callbackFire("onOpen"))) : "close" === a && (a = this._callbackFire("onPreClose", [b]), -1 === e.inArray(!1, a) && (this.s.displayController.close(this,
        function() {
            d.s.displayed = !1;
            c && c()
        }), this._callbackFire("onClose")))
    };
    f.prototype._findField = function(a) {
        for (var c = 0,
        b = this.s.fields.length; c < b; c++) if (this.s.fields[c].name === a) return this.s.fields[c];
        return n
    };
    f.prototype._findFieldIndex = function(a) {
        for (var c = 0,
        b = this.s.fields.length; c < b; c++) if (this.s.fields[c].name === a) return c;
        return n
    };
    f.prototype._message = function(a, c, b) {
        "" === b && this.s.displayed ? "slide" === c ? e(a).slideUp() : e(a).fadeOut() : "" === b ? a.style.display = "none": this.s.displayed ? "slide" === c ? e(a).html(b).slideDown() : e(a).html(b).fadeIn() : (e(a).html(b), a.style.display = "block")
    };
    f.prototype._processing = function(a) { (this.s.processing = a) ? (this.dom.processing.style.display = "block", e(this.dom.wrapper).addClass(this.classes.processing.active)) : (this.dom.processing.style.display = "none", e(this.dom.wrapper).removeClass(this.classes.processing.active));
        this._callbackFire("onProcessing", [a])
    };
    f.prototype._ajaxUri = function(a) {
        a = "create" === this.s.action && this.s.ajaxUrl.create ? this.s.ajaxUrl.create: "edit" === this.s.action && this.s.ajaxUrl.edit ? this.s.ajaxUrl.edit.replace(/_id_/, this.s.id) : "remove" === this.s.action && this.s.ajaxUrl.remove ? this.s.ajaxUrl.remove.replace(/_id_/, a.join(",")) : this.s.ajaxUrl;
        return - 1 !== a.indexOf(" ") ? (a = a.split(" "), {
            method: a[0],
            url: a[1]
        }) : {
            method: "POST",
            url: a
        }
    };
    f.prototype._submit = function(a, c, b, d) {
        var h = this,
        f, g, i, k = e(this.s.domTable).dataTable(),
        l = {
            action: this.s.action,
            table: this.s.dbTable,
            id: this.s.id,
            data: {}
        };
        "create" === this.s.action || "edit" === this.s.action ? e.each(this.s.fields,
        function(a, c) {
            i = k.oApi._fnSetObjectDataFn(c.name);
            i(l.data, h.get(c.name))
        }) : l.data = this._rowId(this.s.removeRows);
        b && b(l);
        b = this._callbackFire("onPreSubmit", [l]); - 1 !== e.inArray(!1, b) ? this._processing(!1) : (b = this._ajaxUri(l.data), this.s.ajax(b.method, b.url, l,
        function(b) {
            h._callbackFire("onPostSubmit", [b, l]);
            b.error || (b.error = "");
            b.fieldErrors || (b.fieldErrors = []);
            if ("" !== b.error || 0 !== b.fieldErrors.length) {
                h.error(b.error);
                f = 0;
                for (g = b.fieldErrors.length; f < g; f++) h._findField(b.fieldErrors[f].name),
                h.error(b.fieldErrors[f].name, b.fieldErrors[f].status || "Error");
                var j = e("div." + h.classes.field.error + ":eq(0)");
                0 < b.fieldErrors.length && 0 < j.length && e(h.dom.bodyContent, h.s.wrapper).animate({
                    scrollTop: j.position().top
                },
                600);
                c && c.call(h, b)
            } else {
                j = b.row ? b.row: {};
                if (!b.row) {
                    f = 0;
                    for (g = h.s.fields.length; f < g; f++) {
                        var m = h.s.fields[f];
                        null !== m.dataProp && m.dataSourceSet(j, h.field(m.name).get())
                    }
                }
                h._callbackFire("onSetData", [b, j, h.s.action]);
                if (k.fnSettings().oFeatures.bServerSide) k.fnDraw();
                else if ("create" === h.s.action) null === h.s.idSrc ? j.DT_RowId = b.id: (i = k.oApi._fnSetObjectDataFn(h.s.idSrc), i(j, b.id)),
                h._callbackFire("onPreCreate", [b, j]),
                k.fnAddData(j),
                h._callbackFire(["onCreate", "onPostCreate"], [b, j]);
                else if ("edit" === h.s.action) h._callbackFire("onPreEdit", [b, j]),
                k.fnUpdate(j, h.s.editRow),
                h._callbackFire(["onEdit", "onPostEdit"], [b, j]);
                else if ("remove" === h.s.action) {
                    h._callbackFire("onPreRemove", [b]);
                    f = 0;
                    for (g = h.s.removeRows.length; f < g; f++) k.fnDeleteRow(h.s.removeRows[f], !1);
                    k.fnDraw();
                    h._callbackFire(["onRemove", "onPostRemove"], [b])
                }
                h.s.action = null; (d === n || d) && h._display("close",
                function() {
                    h._clearDynamicInfo()
                },
                "submit");
                a && a.call(h, b);
                h._callbackFire(["onSubmitSuccess", "onSubmitComplete"], [b, j])
            }
            h._processing(!1)
        },
        function(a, b, e) {
            h._callbackFire("onPostSubmit", [a, b, e, l]);
            h.error(h.i18n.error.system);
            h._processing(!1);
            c && c.call(h, a, b, e);
            h._callbackFire(["onSubmitError", "onSubmitComplete"], [a, b, e, l])
        }))
    };
    f.prototype._rowId = function(a, c, b) {
        c = e(this.s.domTable).dataTable();
        b = c._(a)[0];
        c = c.oApi._fnGetObjectDataFn(this.s.idSrc);
        if (e.isArray(a)) {
            for (var d = [], f = 0, g = a.length; f < g; f++) d.push(this._rowId(a[f], c, b));
            return d
        }
        return null === this.s.idSrc ? a.id: c(b)
    };
    f.defaults = {
        domTable: null,
        ajaxUrl: "",
        fields: [],
        dbTable: "",
        display: "lightbox",
        ajax: function(a, c, b, d, f) {
            e.ajax({
                type: a,
                url: c,
                data: b,
                dataType: "json",
                success: function(a) {
                    d(a)
                },
                error: function(a, b, c) {
                    f(a, b, c)
                }
            })
        },
        idSrc: null,
        events: {
            onProcessing: null,
            onOpen: null,
            onPreOpen: null,
            onClose: null,
            onPreClose: null,
            onPreSubmit: null,
            onPostSubmit: null,
            onSubmitComplete: null,
            onSubmitSuccess: null,
            onSubmitError: null,
            onInitCreate: null,
            onPreCreate: null,
            onCreate: null,
            onPostCreate: null,
            onInitEdit: null,
            onPreEdit: null,
            onEdit: null,
            onPostEdit: null,
            onInitRemove: null,
            onPreRemove: null,
            onRemove: null,
            onPostRemove: null,
            onSetData: null,
            onInitComplete: null
        },
        i18n: {
            create: {
                button: "New",
                title: "Create new entry",
                submit: "Create"
            },
            edit: {
                button: "Edit",
                title: "Edit entry",
                submit: "Update"
            },
            remove: {
                button: "Delete",
                title: "Delete",
                submit: "Delete",
                confirm: {
                    _: "Are you sure you wish to delete %d rows?",
                    1 : "Are you sure you wish to delete 1 row?"
                }
            },
            error: {
                system: "An error has occurred - Please contact the system administrator"
            }
        }
    };
    f.classes = {
        wrapper: "DTE",
        processing: {
            indicator: "DTE_Processing_Indicator",
            active: "DTE_Processing"
        },
        header: {
            wrapper: "DTE_Header",
            content: "DTE_Header_Content"
        },
        body: {
            wrapper: "DTE_Body",
            content: "DTE_Body_Content"
        },
        footer: {
            wrapper: "DTE_Footer",
            content: "DTE_Footer_Content"
        },
        form: {
            wrapper: "DTE_Form",
            content: "DTE_Form_Content",
            tag: "",
            info: "DTE_Form_Info",
            clear: "DTE_Form_Clear",
            error: "DTE_Form_Error",
            buttons: "DTE_Form_Buttons"
        },
        field: {
            wrapper: "DTE_Field",
            typePrefix: "DTE_Field_Type_",
            namePrefix: "DTE_Field_Name_",
            label: "DTE_Label",
            input: "DTE_Field_Input",
            error: "DTE_Field_StateError",
            "msg-label": "DTE_Label_Info",
            "msg-error": "DTE_Field_Error",
            "msg-message": "DTE_Field_Message",
            "msg-info": "DTE_Field_Info"
        },
        actions: {
            create: "DTE_Action_Create",
            edit: "DTE_Action_Edit",
            remove: "DTE_Action_Remove"
        }
    };
    m.TableTools && (j = m.TableTools.BUTTONS, j.editor_create = e.extend(!0, j.text, {
        sButtonText: null,
        editor: null,
        formTitle: null,
        formButtons: [{
            label: null,
            fn: function() {
                this.submit()
            }
        }],
        fnClick: function(a, c) {
            c.editor.create(c.formTitle, c.formButtons)
        }
    }), j.editor_edit = e.extend(!0, j.select_single, {
        sButtonText: null,
        editor: null,
        formTitle: null,
        formButtons: [{
            label: null,
            fn: function() {
                this.submit()
            }
        }],
        fnClick: function(a, c) {
            var b = this.fnGetSelected();
            b.length === 1 && c.editor.edit(b[0], c.formTitle, c.formButtons)
        }
    }), j.editor_remove = e.extend(!0, j.select, {
        sButtonText: null,
        editor: null,
        formTitle: null,
        formButtons: [{
            label: null,
            fn: function() {
                var a = this;
                this.submit(function() {
                    m.TableTools.fnGetInstance(e(a.s.domTable)[0]).fnSelectNone()
                })
            }
        }],
        question: null,
        fnClick: function(a, c) {
            var b = this.fnGetSelected();
            if (b.length !== 0) {
                c.editor.message(typeof c.question === "function" ? c.question(b.length) : c.question);
                c.editor.remove(b, c.formTitle, c.formButtons)
            }
        }
    }));
    f.fieldTypes = {};
    var p = function(a) {
        return e.isPlainObject(a) ? {
            val: a.value !== n ? a.value: a.label,
            label: a.label
        }: {
            val: a,
            label: a
        }
    },
    l = f.fieldTypes,
    j = e.extend(!0, {},
    f.models.fieldType, {
        get: function(a) {
            return a._input.val()
        },
        set: function(a, c) {
            a._input.val(c)
        },
        enable: function(a) {
            a._input.prop("disabled", false)
        },
        disable: function(a) {
            a._input.prop("disabled", true)
        }
    });
    l.hidden = e.extend(!0, {},
    j, {
        create: function(a) {
            a._val = a.value;
            return null
        },
        get: function(a) {
            return a._val
        },
        set: function(a, c) {
            a._val = c
        }
    });
    l.readonly = e.extend(!0, {},
    j, {
        create: function(a) {
            a._input = e("<input/>").attr(e.extend({
                id: a.id,
                type: "text",
                readonly: "readonly"
            },
            a.attr || {}));
            return a._input[0]
        }
    });
    l.text = e.extend(!0, {},
    j, {
        create: function(a) {
            a._input = e("<input/>").attr(e.extend({
                id: a.id,
                type: "text"
            },
            a.attr || {}));
            return a._input[0]
        }
    });
    l.password = e.extend(!0, {},
    j, {
        create: function(a) {
            a._input = e("<input/>").attr(e.extend({
                id: a.id,
                type: "password"
            },
            a.attr || {}));
            return a._input[0]
        }
    });
    l.textarea = e.extend(!0, {},
    j, {
        create: function(a) {
            a._input = e("<textarea/>").attr(e.extend({
                id: a.id
            },
            a.attr || {}));
            return a._input[0]
        }
    });
    l.select = e.extend(!0, {},
    j, {
        _addOptions: function(a, c) {
            var b = a._input[0].options;
            b.length = 0;
            if (c) for (var e = 0,
            d = c.length; e < d; e++) {
                var f = p(c[e]);
                b[e] = new Option(f.label, f.val)
            }
        },
        create: function(a) {
            a._input = e("<select/>").attr(e.extend({
                id: a.id
            },
            a.attr || {}));
            l.select._addOptions(a, a.ipOpts);
            return a._input[0]
        },
        update: function(a, c) {
            var b = e(a._input).val();
            l.select._addOptions(a, c);
            e(a._input).val(b)
        }
    });
    l.checkbox = e.extend(!0, {},
    j, {
        _addOptions: function(a, c) {
            var b = a._input.empty();
            if (c) for (var e = 0,
            d = c.length; e < d; e++) {
                var f = p(c[e]);
                b.append('<div><input id="' + a.id + "_" + e + '" type="checkbox" value="' + f.val + '" /><label for="' + a.id + "_" + e + '">' + f.label + "</label></div>")
            }
        },
        create: function(a) {
            a._input = e("<div />");
            l.checkbox._addOptions(a, a.ipOpts);
            return a._input[0]
        },
        get: function(a) {
            var c = [];
            a._input.find("input:checked").each(function() {
                c.push(this.value)
            });
            return a.separator ? c.join(a.separator) : c
        },
        set: function(a, c) {
            var b = a._input.find("input"); ! e.isArray(c) && typeof c === "string" ? c = c.split(a.separator || "|") : e.isArray(c) || (c = [c]);
            var d, f = c.length,
            g;
            b.each(function() {
                g = false;
                for (d = 0; d < f; d++) if (this.value == c[d]) {
                    g = true;
                    break
                }
                this.checked = g
            })
        },
        enable: function(a) {
            a._input.find("input").prop("disabled", false)
        },
        disable: function(a) {
            a._input.find("input").prop("disabled", true)
        },
        update: function(a, c) {
            var b = l.checkbox.get(a);
            l.checkbox._addOptions(a, c);
            l.checkbox.get(a, b)
        }
    });
    l.radio = e.extend(!0, {},
    j, {
        _addOptions: function(a, c) {
            var b = a._input.empty();
            if (c) for (var d = 0,
            f = c.length; d < f; d++) {
                var g = p(c[d]);
                b.append('<input id="' + a.id + "_" + d + '" type="radio" name="' + a.name + '" style="float:left"/><label for="' + a.id + "_" + d + '" style="margin-left: 20px;">' + g.label + "</label>");
                e("input:last", b).attr("value", g.val)
            }
        },
        create: function(a) {
            a._input = e("<div />");
            l.radio._addOptions(a, a.ipOpts);
            this.on("onOpen",
            function() {
                a._input.find("input").each(function() {
                    if (this._preChecked) this.checked = true
                })
            });
            return a._input[0]
        },
        get: function(a) {
            return a._input.find("input:checked").val()
        },
        set: function(a, c) {
            a._input.find("input").each(function() {
                this._preChecked = false;
                if (this.value == c) this._preChecked = this.checked = true
            })
        },
        enable: function(a) {
            a._input.find("input").prop("disabled", false)
        },
        disable: function(a) {
            a._input.find("input").prop("disabled", true)
        },
        update: function(a, c) {
            var b = l.radio.get(a);
            l.radio._addOptions(a, c);
            l.radio.get(a, b)
        }
    });
    l.date = e.extend(!0, {},
    j, {
        create: function(a) {
            a._input = e("<input />").attr(e.extend({
                id: a.id
            },
            a.attr || {}));
            if (!a.dateFormat) a.dateFormat = e.datepicker.RFC_2822;
            if (!a.dateImage) a.dateImage = "../../../images/calender.png";
            e(this).bind("onInitComplete",
            function() {
                e(a._input).datepicker({
                    showOn: "both",
                    dateFormat: a.dateFormat,
                    buttonImage: a.dateImage,
                    buttonImageOnly: true
                });
                e("#ui-datepicker-div").css("display", "none")
            });
            return a._input[0]
        },
        set: function(a, c) {
            a._input.datepicker("setDate", c)
        },
        enable: function(a) {
            a._input.datepicker("enable")
        },
        disable: function(a) {
            a._input.datepicker("disable")
        }
    });
    f.prototype.CLASS = "Editor";
    f.VERSION = "1.2.3";
    f.prototype.VERSION = f.VERSION
})(window, document, void 0, jQuery, jQuery.fn.dataTable);